// 购物车状态
import { mergeLocalCart, findCartList, insertCart, deleteCart, updateCart, checkAllCart } from '@/api/cart'
export default {
  namespaced: true,
  state: () => ({
    CartList: [] // 购物车列表
  }),
  getters: {
    // 有效商品列表  isEffective为true筛选出来
    isEffectiveList (state) {
      return state.CartList.filter(item => item.isEffective)
    },
    // 有效商品总数  把有效商品列表中的count字段叠加
    effectiveCount (state, getters) {
      return getters.isEffectiveList.reduce((a, c) => a + c.count, 0)
    },
    // 有效商品总价
    effectivePrice (state, getters) {
      console.log(getters.isEffectiveList)
      return getters.isEffectiveList.reduce((a, c) => a + c.count * c.price, 0)
    },
    // 已选商品列表  selected 为true 代表已选
    selectedList (state) {
      return state.CartList.filter(item => item.selected)
    },
    // 已选择的商品数量  基于已选商品列表count和
    selectedCount (state, getters) {
      return getters.selectedList.reduce((a, c) => a + c.count, 0)
    },
    // 已选商品总价   所有已选商品列表中的 count * nowPrice 的和
    selectedPrice (state, getters) {
      return getters.selectedList.reduce((a, c) => a + c.count * c.nowPrice, 0)
    },
    // 是否为全选的状态
    isAll (state, getters) {
      // 当有效商品列表中的每一项selected都为true时  才是选中
      return getters.isEffectiveList.every((item) => item.selected)
    }
  },
  mutations: {
    // 改数据函数
    // 加入购物车
    insertCartList (state, good) {
      // good是一个包含了完整商品信息的对象
      // 核心逻辑: 如果当前添加的是同一个规格商品 就在已经添加的数量上做叠加操作
      // 如果从来没有添加过 就直接push
      // 核心的判断条件: 使用good去cartList中进行匹配 匹配的上就是添加过 否则就是未添加过
      // 通过skuId去 CartList 寻找   如果找到了 代表是数量添加 如果没有找到 就是push
      const curItem = state.CartList.find(item => item.skuId === good.skuId)
      if (curItem) {
        // 如果找到了 代表是数量添加
        curItem.count = curItem.count + good.count
      } else {
        // 如果没有找到 就是push
        state.CartList.push(good)
      }
    },
    // 删除购物车
    delCart (state, good) {
      const index = state.CartList.findIndex(item => item.skuId === good.skuId)
      state.CartList.splice(index, 1)
    },
    // 单选功能
    singleCheck (state, { curItem, selected }) {
      // 找到要操作的项  修改selected
      const item = state.CartList.find(item => item.skuId === curItem.skuId)
      item.selected = selected
    },
    // 全选功能
    allCheck (state, selected) {
      state.CartList.forEach(item => {
        item.selected = selected
      })
    },
    // 数量修改
    changeCount (state, { curItem, count }) {
      const item = state.CartList.find(item => item.skuId === curItem.skuId)
      item.count = count
    },
    // 登录后覆盖购物车列表数据
    setCartList (state, list) {
      state.CartList = list
    },
    // 退出登录清空购物车
    clearCart (state) {
      state.CartList = []
    }
  },
  actions: {
    // 请求数据函数
    asyncInsertCart (ctx, good) { // 加入购物车
      // 分为两种状态   登录  未登录
      return new Promise((resolve, reject) => {
        // 跨模块获取state中的数据   ctx.rootState
        if (ctx.rootState.user.profile.token) {
          // 已登录  写已经登录的逻辑  调接口 再提交mutations函数
          insertCart({ skuId: good.skuId, count: good.count }).then(() => {
            // 再拉去最新购物车列表   覆盖本地的数据
            findCartList().then(res => {
              ctx.commit('setCartList', res.data.result)
              resolve()
            })
          })
        } else {
          // 未登录  把商品信息加入到本地的vuex
          // 调用mutations函数
          ctx.commit('insertCartList', good)
          resolve()
        }
      })
    },
    asyncDelCart (ctx, good) { // 删除购物车
      // 分为两种状态   登录  未登录
      return new Promise((resolve, reject) => {
        // 跨模块获取state中的数据   ctx.rootState
        if (ctx.rootState.user.profile.token) {
          // 已登录  写已经登录的逻辑  调接口 再提交mutations函数
          deleteCart([good.skuId]).then(() => {
            // 再拉去最新购物车列表   覆盖本地的数据
            findCartList().then(res => {
              ctx.commit('setCartList', res.data.result)
              resolve()
            })
          })
        } else {
          // 未登录  把商品信息加入到本地的vuex
          // 调用mutations函数
          ctx.commit('delCart', good)
          resolve()
        }
      })
    },
    asyncSingleCheck (ctx, { curItem, selected }) { // 单选影响全选
      // 分为两种状态   登录  未登录
      return new Promise((resolve, reject) => {
        // 跨模块获取state中的数据   ctx.rootState
        if (ctx.rootState.user.profile.token) {
          // 已登录  写已经登录的逻辑  调接口 再提交mutations函数
          updateCart({ skuId: curItem.skuId, count: curItem.count, selected }).then(() => {
            // 再拉去最新购物车列表   覆盖本地的数据
            findCartList().then(res => {
              ctx.commit('setCartList', res.data.result)
              resolve()
            })
          })
        } else {
          // 未登录  把商品信息加入到本地的vuex
          // 调用mutations函数
          ctx.commit('singleCheck', { curItem, selected })
          resolve()
        }
      })
    },
    asyncAllCheck (ctx, selected) { // 全选影响单选
      // 分为两种状态   登录  未登录
      return new Promise((resolve, reject) => {
        // 跨模块获取state中的数据   ctx.rootState
        if (ctx.rootState.user.profile.token) {
          // 已登录  写已经登录的逻辑  调接口 再提交mutations函数
          const ids = ctx.getters.isEffectiveList.map(item => item.skuId)
          checkAllCart({ ids, selected }).then(() => {
            // 再拉去最新购物车列表   覆盖本地的数据
            findCartList().then(res => {
              ctx.commit('setCartList', res.data.result)
              resolve()
            })
          })
        } else {
          // 未登录  把商品信息加入到本地的vuex
          // 调用mutations函数
          ctx.commit('allCheck', selected)
          resolve()
        }
      })
    },
    asyncChangeCount (ctx, { curItem, count }) { // 修改数量
      // 分为两种状态   登录  未登录
      return new Promise((resolve, reject) => {
        // 跨模块获取state中的数据   ctx.rootState
        if (ctx.rootState.user.profile.token) {
          // 已登录  写已经登录的逻辑  调接口 再提交mutations函数
          updateCart({ skuId: curItem.skuId, count, selected: curItem.selected }).then(() => {
            // 再拉去最新购物车列表   覆盖本地的数据
            findCartList().then(res => {
              ctx.commit('setCartList', res.data.result)
              resolve()
            })
          })
        } else {
          // 未登录  把商品信息加入到本地的vuex
          // 调用mutations函数
          ctx.commit('changeCount', { curItem, count })
          resolve()
        }
      })
    },
    // 合并购物车
    asyncMergeCart (ctx) {
      // 本地购物车数据为零无需合并
      if (ctx.state.CartList.length === 0) {
        return false
      }
      // 准备参数  [{},{}]  map
      const reqList = ctx.state.CartList.map(item => {
        return { skuId: item.skuId, selected: item.selected, count: item.count }
      })
      mergeLocalCart(reqList).then(() => {
        // 上面的接口调用成功才调用获取list接口
        // console.log(123)
        findCartList().then((res) => {
          // console.log('获取登录后的购物车列表', res)
          ctx.commit('setCartList', res.data.result)
        })
      })
    }
  }
}
